import streamlit as st
import qrcode
from io import BytesIO
import zipfile
st.set_page_config(page_title="qr_code_generator", page_icon="🔖", layout="centered")

def generate_qr_code(data):
    """生成二维码并返回二进制流对象。"""
    qr = qrcode.QRCode(
        version=1,  # 控制二维码大小（1到40，数字越大尺寸越大）
        error_correction=qrcode.constants.ERROR_CORRECT_H,  # 容错级别
        box_size=10,  # 每个方块的像素大小
        border=4,  # 边框宽度，单位为方块
    )
    qr.add_data(data)
    qr.make(fit=True)

    # 生成图片
    img = qr.make_image(fill_color="black", back_color="white")

    # 将图片保存到字节流中
    buffer = BytesIO()
    img.save(buffer, format="PNG")
    buffer.seek(0)
    return buffer

def create_zip(qr_data_list):
    """将多个二维码图片打包成一个 ZIP 文件并返回二进制流对象。"""
    zip_buffer = BytesIO()
    with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file:
        for idx, (data, qr_buffer) in enumerate(qr_data_list):
            zip_file.writestr(f"qr_code_{idx + 1}.png", qr_buffer.getvalue())
    zip_buffer.seek(0)
    return zip_buffer



# 自定义样式
st.markdown(
    """
    <style>
    .title {
        text-align: center;
        font-size: 3rem;
        color: #4CAF50;
        font-weight: bold;
        margin-bottom: 20px;
    }
    .subtitle {
        text-align: center;
        font-size: 1.2rem;
        color: #888;
        margin-bottom: 40px;
    }
    .input-box {
        margin: 20px auto;
        padding: 20px;
        border-radius: 10px;
        background-color: #f9f9f9;
        box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
        max-width: 600px;
    }
    .qr-image {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        gap: 20px;
        margin-top: 30px;
    }
    .qr-container {
        display: flex;
        flex-direction: column;
        align-items: center;
        margin-bottom: 20px;
    }
    .download-btn {
        margin-bottom: 10px;
        padding: 10px 20px;
        font-size: 1rem;
        font-weight: bold;
        color: white;
        background: linear-gradient(90deg, #4CAF50, #2E8B57);
        border: none;
        border-radius: 5px;
        cursor: pointer;
        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        transition: all 0.3s ease;
    }
    .download-btn:hover {
        background: linear-gradient(90deg, #2E8B57, #4CAF50);
        box-shadow: 0 6px 8px rgba(0, 0, 0, 0.2);
    }
    .char-limit-warning {
        color: red;
        font-size: 0.9rem;
        margin-top: 5px;
        text-align: right;
    }
    </style>
    """,
    unsafe_allow_html=True,
)
# Streamlit 页面设置
st.title("🔖 在线二维码生成器")
st.caption("作者：何双新 ｜ 功能：二维码批量生成工具")
# 页面标题
# st.markdown('<div class="title">🔖 在线二维码生成器</div>', unsafe_allow_html=True)
# st.markdown('<div class="subtitle">选择数量并输入内容生成二维码</div>', unsafe_allow_html=True)

# 用户输入：选择数量
num_qr_codes = st.number_input("选择要生成的二维码数量：", min_value=1, max_value=20, step=1, value=1)

# 动态生成输入框
inputs = []
for i in range(num_qr_codes):
    user_input = st.text_input(f"输入内容 {i + 1}：", placeholder=f"输入第 {i + 1} 个二维码的内容")
    inputs.append(user_input)

# 生成二维码
if st.button("生成二维码"):
    qr_data_list = []
    for i, input_data in enumerate(inputs):
        if input_data.strip():
            qr_data_list.append((input_data, generate_qr_code(input_data)))
        else:
            st.warning(f"第 {i + 1} 个输入框为空，跳过生成！")

    if qr_data_list:
        # 显示二维码，每行显示 3 个
        num_per_row = 3
        rows = (len(qr_data_list) + num_per_row - 1) // num_per_row  # 计算需要的行数
        for row_idx in range(rows):
            cols = st.columns(num_per_row)  # 每行创建 3 个列
            for col_idx, (data, qr_buffer) in enumerate(
                qr_data_list[row_idx * num_per_row : (row_idx + 1) * num_per_row]
            ):
                with cols[col_idx]:
                    st.image(qr_buffer, caption=f"二维码 {row_idx * num_per_row + col_idx + 1}", width=200)

        # 打包成 ZIP 文件
        zip_file = create_zip(qr_data_list)

        # 提供 ZIP 下载按钮
        st.download_button(
            label="下载所有二维码（ZIP 文件）",
            data=zip_file,
            file_name="qrcodes.zip",
            mime="application/zip",
            help="点击下载生成的所有二维码图片",
        )
    else:
        st.warning("请至少填写一个输入框的内容！")
st.caption("安徽智加数字科技有限公司 · 技术学习组出品 🚀")
